/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.controller;

import com.db.Conector;
import com.db.SqlManager;
import com.exception.DataException;
import com.model.GrupoManager;
import com.model.ManagerFactory;
import com.util.UtilDate;
import com.util.UtilTransaccion;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.*;

import java.io.*;
import java.sql.Connection;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;

/**
 *
 * @author Administrador
 */
public class DownloadFile extends HttpServlet {

    HttpSession sesion;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, DataException {
        response.setContentType("text/html;charset=UTF-8");
        
        int accion = Integer.parseInt(request.getParameter("accion"));
        sesion = request.getSession(true);
        
        switch(accion){
            case 1 : exportarLibroVentasPdf(request,response); break;
            case 2 : exportarLibroVentasXls(request,response); break;
            default : System.out.println("accion = "+accion+" no existe el servlet DownloadFile.java");
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (DataException ex) {
            Logger.getLogger(DownloadFile.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (DataException ex) {
            Logger.getLogger(DownloadFile.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
    private void exportarLibroVentasPdf(HttpServletRequest request, HttpServletResponse response) throws IOException, DataException {
        Connection c = null;
        String[] datos = ((String)request.getParameter("matCarrera")).split("_");// idMateria_idCarrera_idGestion
        int idGestion = Integer.parseInt(datos[0]);
        int idGrupo   = Integer.parseInt(datos[1]);
        int idMateria = Integer.parseInt(datos[2]);
        int idCarrera = Integer.parseInt(datos[3]);
        String nombCarrera = datos[4];
        String nombMateria = datos[5];
        int idPensum = Integer.parseInt(datos[6]);
        
        
        try {
            c = Conector.getConexion();
            GrupoManager gManager = ManagerFactory.getGrupoManagerInstance(c);
            
            Map parameters = new HashMap ();
            parameters.clear();
            String fe = UtilDate.getFechaActualDetallado();
            
            parameters.put ("fechaNow", fe );
            parameters.put("idGestion", idGestion);
            parameters.put("idGrupo", idGrupo);
            parameters.put("idMateria", idMateria);
            parameters.put("idCarrera", idCarrera);
            
            ServletOutputStream out;
            // Creamos un objecto jasper con el fichero previamente compilado
            ServletContext contextoDelServlet = getServletConfig().getServletContext();
            contextoDelServlet.getAttribute("org.apache.catalina.jsp_classpath");            
            
            int existeAlumnos = gManager.existeAlumnos(idGestion, idGrupo, idMateria, idCarrera);
            File reportFile = new File("");
            if(existeAlumnos>0){
                reportFile = new File(contextoDelServlet.getRealPath("/WEB-INF/DOCENTE/operaciones/adminNotas/exportXlsSiss4PDF.jasper")); 
            }else{
                parameters.put("nombCarrera", nombCarrera);
                parameters.put("nombMateria", nombMateria);
                parameters.put("idPensum", idPensum);
                reportFile = new File(contextoDelServlet.getRealPath("/WEB-INF/DOCENTE/operaciones/adminNotas/exportXlsSiss4WithoutStudentsPDF.jasper")); 
            }
            
            
            // Generamos el informe pasandole como parametros el objecto creado anteriormente jasperReport, parameters que es el hashmap
            // creado anteriormente con todos los parametros que necesitemos enviarle al informe y conn una conexión activa con vuestro
            // servidor de BD
            byte[] fichero = JasperRunManager.runReportToPdf (reportFile.getPath(), parameters, c);
            // Y enviamos el pdf a la salida del navegador como podríamos hacer con cualquier otro pdf
            response.setContentType ("application/pdf");
            response.setHeader ("Content-disposition", "inline; filename="+"NOTAS_Ge"+datos[0]+"_Gr"+datos[1]+"_Ma"+datos[2]+"_Ca"+datos[3]+".pdf");
            response.setHeader ("Cache-Control", "max-age=30");
            response.setHeader ("Pragma", "No-cache");
            response.setDateHeader ("Expires", 0);
            response.setContentLength (fichero.length);
            out = response.getOutputStream ();

            out.write (fichero, 0, fichero.length);
            out.flush ();
            out.close ();
            
            
        }catch(Exception ex){
            System.out.println("msgError al exportar Pdf "+UtilDate.getDateTime()+" DownloadFile -> exportarLibroVentasPdf(request,response) "+ex.getMessage());
        } finally { 
            SqlManager.closeConexion(c);
        }
    }

    private void exportarLibroVentasXls(HttpServletRequest request, HttpServletResponse response) throws DataException{
        Connection c = null;
        String[] datos = ((String)request.getParameter("matCarrera")).split("_");// idGestion_idGrupo_idMateria_idCarrera
        int idGestion = Integer.parseInt(datos[0]);
        int idGrupo   = Integer.parseInt(datos[1]);
        int idMateria = Integer.parseInt(datos[2]);
        int idCarrera = Integer.parseInt(datos[3]);
        String nombCarrera = datos[4];
        String nombMateria = datos[5];
        int idPensum = Integer.parseInt(datos[6]);        
        try {
            c = Conector.getConexion();            
            GrupoManager gManager = ManagerFactory.getGrupoManagerInstance(c);
            int existeAlumnos = gManager.existeAlumnos(idGestion, idGrupo, idMateria, idCarrera);
            
            Map parameters = new HashMap ();
            parameters.clear();
            String fe = UtilDate.getFechaActualDetallado();
            parameters.put ("fechaNow", fe );
            parameters.put("idGestion", idGestion);
            parameters.put("idGrupo", idGrupo);
            parameters.put("idMateria", idMateria);
            parameters.put("idCarrera", idCarrera);
            
            int bit;
            File f;
            InputStream in;
            ServletOutputStream out;
            
            ServletContext contextoDelServlet = getServletConfig().getServletContext();
            contextoDelServlet.getAttribute("org.apache.catalina.jsp_classpath");
            
            DateFormat dateFormat = new SimpleDateFormat("ddMMyyyy");
            String res = dateFormat.format(Calendar.getInstance().getTime());         
            
            File reportFile = new File("");
            if(existeAlumnos>0){
                reportFile = new File(contextoDelServlet.getRealPath("/WEB-INF/DOCENTE/operaciones/adminNotas/exportXlsSiss4.jasper")); 
            }else{
                parameters.put("nombCarrera", nombCarrera);
                parameters.put("nombMateria", nombMateria);
                parameters.put("idPensum", idPensum);
                reportFile = new File(contextoDelServlet.getRealPath("/WEB-INF/DOCENTE/operaciones/adminNotas/exportXlsSiss4WithoutStudents.jasper")); 
            }
            
            
            JasperPrint jasperPrint=JasperFillManager.fillReport (reportFile.getPath(), parameters, c);
            String xlsFileName = res+"FormatoNotas_Ge"+datos[0]+"_Gr"+datos[1]+"_Ma"+datos[2]+"_Ca"+datos[3]+".xls";
            //Creacion del XLS
            JRXlsExporter exporter = new JRXlsExporter ();
            exporter.setParameter (JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter (JRExporterParameter.OUTPUT_FILE_NAME, xlsFileName);
            exporter.setParameter (JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
            exporter.exportReport ();

            // En este punto ya esta Creado el XLS
            // Ahora leemos el fichero y forzamos al navegador a que nos descargue el fichero.
            f = new File ( xlsFileName);

            response.setContentType ("application/vnd.ms-excel"); //Tipo de fichero.
            response.setHeader ("Content-Disposition", "attachment;filename=\"" + xlsFileName + "\""); //Configurar cabecera http

            in = new FileInputStream (f);
            out = response.getOutputStream ();

            bit = 256;
            while ((bit) >= 0)
            {
            bit = in.read ();
            out.write (bit);
            }

            out.flush ();
            out.close ();
            in.close ();
        }catch(Exception ex){
            System.out.println("msgError al iniciar xls "+UtilDate.getDateTime()+" Reporte -> exportarLibroVentasXls(request,response) "+ex.getMessage());
        } finally { 
            SqlManager.closeConexion(c);
        }
    }
}
